/* 
 * File:   main.c
 * Author: luismiguelneiva
 * 
 * nuno nunes
 * 
 * Created on 6 de Janeiro de 2012, 15:51
 */

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#include "main.h"
 
/*Função createUser1, pede os dados do utilizador
ao utilizador do programa, tem o return no fim*/
Utilizador getUtilizadorFromTeclado (){

   Utilizador user;

   printf("Qual o nome: ");
   scanf("%s", user.nome);
   printf("\n");
   printf("Qual o numero: ");
   scanf("%d", &user.numero);
   printf("\n");
   printf("Qual a pass: ");
   scanf("%s", user.pass);
   printf("\n");
   printf("Qual o seu tipo (0-aluno, 1-Docente, 2-DocenteRegente): ");
   ///scanf("%d", &(user.tipoUtilizador);
   printf("\n");
   return user;
}

/*Função displayUser, mostra o user criado na função
createUser, chama o tipo (Utilizador) e o parametro (user)*/
void displayUser(Utilizador user ){
   printf("Nome: ");
   printf("%s", user.nome);
   printf("\n");
   printf("Número: ");
   printf("%d", user.numero);
   printf("\n");
   printf("Pass: ");
   printf("%s", user.pass);
   printf("\n");
   printf("Tipo: ");

   /*If para mostrar no tipo de utilizador
    Aluno, Docente ou Docente-Regentes em
    vez de 0, 1 e 2*/
   if (user.tipoUtilizador == 0) {
       printf("Aluno\n"); 
   }
   if (user.tipoUtilizador == 1) {
       printf("Docente\n");
   }
   if (user.tipoUtilizador == 2) {
       printf("DocenteRegente\n");
   }

}

//User em lista
void displayListUser(Utilizador user ){
   printf("Nome: ");
   printf("%s", user.nome);
   printf(" Número: ");
   printf("%d", user.numero);
   printf(" Pass: ");
   printf("%s", user.pass);
   printf(" Tipo: ");

   /*
    * If para mostrar no tipo de utilizador Aluno, Docente ou Docente-Regentes 
    * em vez de 0, 1 e 2
    */
   if (user.tipoUtilizador == aluno) {
       printf("Aluno\n"); 
   }
   if (user.tipoUtilizador == Docente) {
       printf("Docente\n");
   }
   if (user.tipoUtilizador == DocenteRegente) {
       printf("DocenteRegente\n");
   }

}

int DisplayListOfUsers(struct_noListaUtilizador* p_Primeiro)
{
   struct_noListaUtilizador* p_temp = p_Primeiro;
   
   int menuItem;
   
   do
   {
   //*colocar displayUser
   displayListUser((*p_temp).user);
   printf("\n");
   p_temp = (*p_temp).p_Next;
   }while (p_temp!=0);
   
   printf("\n\n");
   printf("\t|===============================================|\n");
   printf("\t|1 ->  Voltar ao Menu Docente                   |\n");
   printf("\t|0 ->  Sair                                     |\n");
   printf("\t|===============================================|\n");
   
   printf("\tEscolha uma opção: ");
   //retornar o menu sleccionado pelo scanf %d
   scanf("%d", &menuItem);

   return menuItem;
   
   switch(menuItem)
   {
       case 1:
       menuDocente_DocentesRegente();
       break;
       
       case 0:
       exit(0);
       break;
   }

}

void appendNovoUtilizador(struct_noListaUtilizador* p_Primeiro, Utilizador NovoUtilizador)
{
//malloc de um novo elemento do tipo noLista
//percorrer a lista até ao úlitmo
//colocar o p_next do ultimo para o novo elemento
//o novo elemento passa a ser o último
struct_noListaUtilizador* p_NovoNoLista = (struct_noListaUtilizador*)malloc(sizeof(struct_noListaUtilizador));
struct_noListaUtilizador* p_temp = p_Primeiro;

(* p_NovoNoLista).user = NovoUtilizador;

(* p_NovoNoLista).p_Next = 0;

//percorrer a lista até ao ultimo elemento...
while ((*p_temp).p_Next!=0)
p_temp = (*p_temp).p_Next;

(*p_temp).p_Next = p_NovoNoLista;

}

void CreateListaDeUtilizadores(struct_noListaUtilizador** p_Primeiro)
{
  
   *p_Primeiro = (struct_noListaUtilizador*)malloc(sizeof(struct_noListaUtilizador));
   
   //10 alunos e 1 Docente e 1 Docente/DocenteRegente
   Utilizador user1;
   strcpy(user1.nome, "Nuno Nunes");
   user1.numero = 8100300;
   strcpy(user1.pass, "nnunes");
   user1.tipoUtilizador = Docente;

   (**p_Primeiro).user = user1;

   //(**p_Primeiro).p_Next = 0;

   Utilizador user2;
   strcpy(user2.nome, "Luis Neiva");
   user2.numero = 8100301;
   strcpy(user2.pass, "lneiva");
   user2.tipoUtilizador = aluno;
   
   appendNovoUtilizador(*p_Primeiro, user2);
   
   Utilizador user3;
   strcpy(user3.nome, "Pedro Santos");
   user3.numero = 8100302;
   strcpy(user3.pass, "psantos");
   user3.tipoUtilizador = aluno;
   
   appendNovoUtilizador(*p_Primeiro, user3);
   
   Utilizador user4;
   strcpy(user4.nome, "João Costa");
   user4.numero = 8100303;
   strcpy(user4.pass, "jcosta");
   user4.tipoUtilizador = aluno;
   
   appendNovoUtilizador(*p_Primeiro, user4);
   
   Utilizador user5;
   strcpy(user5.nome, "Tito Mendes");
   user5.numero = 8100304;
   strcpy(user5.pass, "tmendes");
   user5.tipoUtilizador = aluno;
   
   appendNovoUtilizador(*p_Primeiro, user5);
   
   Utilizador user6;
   strcpy(user6.nome, "António José");
   user6.numero = 8100305;
   strcpy(user6.pass, "ajose");
   user6.tipoUtilizador = aluno;
   
   appendNovoUtilizador(*p_Primeiro, user6);
   
   Utilizador user7;
   strcpy(user7.nome, "Nuno Graça");
   user7.numero = 8100306;
   strcpy(user7.pass, "ngraca");
   user7.tipoUtilizador = aluno;
   
   appendNovoUtilizador(*p_Primeiro, user7);
   
   Utilizador user8;
   strcpy(user8.nome, "Pedro Ribeiro");
   user8.numero = 8100307;
   strcpy(user8.pass, "pribeiro");
   user8.tipoUtilizador = aluno;
   
   appendNovoUtilizador(*p_Primeiro, user8);
   
   Utilizador user9;
   strcpy(user9.nome, "Elísio Fresco");
   user9.numero = 8100308;
   strcpy(user9.pass, "efresco");
   user9.tipoUtilizador = aluno;
   
   appendNovoUtilizador(*p_Primeiro, user9);
   
   Utilizador user10;
   strcpy(user10.nome, "Telmo Pereira");
   user10.numero = 8100309;
   strcpy(user10.pass, "tpereira");
   user10.tipoUtilizador = aluno;
   
   appendNovoUtilizador(*p_Primeiro, user10);
   
   Utilizador user11;
   strcpy(user11.nome, "Júlio Pereira");
   user11.numero = 8200400;
   strcpy(user11.pass, "jpereira");
   user11.tipoUtilizador = Docente;
   
   appendNovoUtilizador(*p_Primeiro, user11);
   
   Utilizador user12;
   strcpy(user12.nome, "Carlos Teixeira");
   user12.numero = 8200401;
   strcpy(user12.pass, "cteixeira");
   user12.tipoUtilizador = DocenteRegente;
   
   appendNovoUtilizador(*p_Primeiro, user12);
   
}

//parâmetros lista dos utilizadores, ponteiro para o char[] nome, primeiro char
//char[] acaba com /0
Utilizador* SearchUtilizador(struct_noListaUtilizador* p_Primeiro, char* p_nome)
{
       //percorre a lista ver display user
       //pra cada user fazer o strcomp do nome do user com o p_nome
       //se for igual a zero ou seja o nome é igual retorna esse user
       
       //if ((strcmp(pass,(*tmp).pass)) == 0)
       
       return (&(*p_Primeiro).user);
}

int main_old(int argc, char** argv) {

 char nome[50];//o nome do array é um char* pro primeiro char -> &nome[0]
 char pass[50];//o nome do array é um char* pro primeiro char -> &pass[0]
 int tentativaslogin = 0;

   //inicio e primeiro elemento da lista
   struct_noListaUtilizador* p_ListaDeUtilizadores;
   
   //
   CreateListaDeUtilizadores(&p_ListaDeUtilizadores);

   //
   //DisplayListOfUsers(p_ListaDeUtilizadores);

   //
   //Utilizador novoUser = getUtilizadorFromTeclado();

   //
   //appendNovoUtilizador(p_ListaDeUtilizadores, novoUser);

   //
   //DisplayListOfUsers(p_ListaDeUtilizadores);
 
/*--------------------------------Menu Login--------------------------------*/
 
 printf("\t______________________________________________________\n");
 printf("\t|=====================================================|\n");
 printf("\t|======        Linguagens de Programação        ======|\n");
 printf("\t|=====================================================|\n");
 printf("\t|                                                     |\n");
 printf("\t|Faça por favor o seu login:                          |\n");
 printf("\t|                                                     |\n");
 printf("\t\t\tUsername: ");
 scanf("%s",nome);
 printf("\t\t\tPassword: ");
 scanf("%s",pass);
 printf("\t-------------------------------------------------------\n");
 
 int isLogado = 0;
 TipoUtilizador tipoUtilizadorLogado;

 while(!isLogado)
 {
   Utilizador* tmp = SearchUtilizador(p_ListaDeUtilizadores, nome);
   //Utilizador* tmp = SearchUtilizador(p_ListaDeUtilizadores, &nome[0]);

   //não encontro o nome
   if (tmp == 0)
   isLogado = 0;

   else
   {
       //encontrou o nome vamos verificar a pass
       if ((strcmp(pass,(*tmp).pass)) == 0)
       {
       isLogado = 1;
       tipoUtilizadorLogado = (*tmp).tipoUtilizador;
       }
   }

  if (!isLogado){
  tentativaslogin = tentativaslogin + 1;

  if (tentativaslogin == 3)
       { 
           printf("Esgotou as 3 tentativas de login, o programa vai encerrar, obrigado.\n\n");
           exit(1);
       }
   
  else
    { 
    //system("clear");
      
    printf("Dados introduzidos errados! Restam %d tentativas!\n\n",3 - tentativaslogin);
    printf("Username:");
    scanf("%s",nome);
    printf("Password:");
    scanf("%s",pass);
       }
   }

   //se chega aqui é porque está logado
   int menuItem;
   
   //while(1){
   switch(tipoUtilizadorLogado)
   {
   
       case aluno:
       menuAlunos();
       break;
       
       case Docente:
       menuItem = menuDocente_DocentesRegente();
       menuDocente_DocentesRegenteSelect(p_ListaDeUtilizadores ,menuItem);
       break;

       case DocenteRegente:
       menuDocenteRegente();
       break;

   }
   }
}

  /*Utilizador user;
   user = createUser1();
   displayUser(user);*/
   
   //return 0;

 //}
 
/*-----------------------------------Menus-----------------------------------*/  

//Alunos
int menuAlunos()
{
   int menuItem;
   
   system("clear");
   printf("\t _______________________________________________\n");
   printf("\t|==============================================|\n");
   printf("\t|======    Linguagens de Programação     ======|\n");
   printf("\t|======              ALunos              ======|\n");
   printf("\t|==============================================|\n");
   printf("\t|                                              |\n");
   printf("\t|1 ->  Alterar Dados Próprios                  |\n");
   printf("\t|2 ->  Escolher Modalidade de Avaliação        |\n");
   printf("\t|3 ->  Consultar situação atual                |\n");
   printf("\t|0 ->  Sair                                    |\n");
   printf("\t------------------------------------------------\n");

   printf("\tEscolha uma opção por favor: ");
   //retornar o menu sleccionado pelo scanf %d
   scanf("%d", &menuItem);

   return menuItem;
}

//Alunos Select Opção Menu
void menuAlunosSelect(struct_noListaUtilizador* p_Primeiro ,int menuItem)
{
   switch(menuItem)
   {
       case 1:
       //Função Alterar Dados próprios
       break;
       
       case 2:
       //Função escolher modalidade de avaliação
       break;
       
       case 3:
       //Função consultar situação atual
       break;
       
       case 0:
       exit(0);
       break;
   }
}


//Docente  
int menuDocente_DocentesRegente()
{
int menuItem;

   //system("clear");

   printf("\t ________________________________________________\n");
   printf("\t|===============================================|\n");
   printf("\t|======     Linguagens de Programação     ======|\n");
   printf("\t|======              Docentes             ======|\n");
   printf("\t|===============================================|\n");
   printf("\t|                                               |\n");
   printf("\t|1 ->  Alterar Dados Próprios                   |\n");
   printf("\t|2 ->  Inserir Utilizador                       |\n");
   printf("\t|3 ->  Listar Alunos por número mecanográfico   |\n");
   printf("\t|4 ->  Remover Utilizador                       |\n");
   printf("\t|5 ->  Alterar Dados de Utilizador              |\n");
   printf("\t|6 ->  Configurar Listagem Alunos (ordenação)   |\n");
   printf("\t|7 ->  Listar Alunos segundo opção de ordenação |\n");
   printf("\t|8 ->  Configurar Listagem Alunos (paginação)   |\n");
   printf("\t|9 ->  Listar Alunos segundo opção de paginação |\n");
   printf("\t|10->  Listar classificações dos alunos         |\n");
   printf("\t|11->  Estatísticas                             |\n");
   printf("\t|0 ->  Sair                                     |\n");
   printf("\t-------------------------------------------------\n");

   printf("\tEscolha uma opção por favor: ");
   //retornar o menu sleccionado pelo scanf %d
   scanf("%d", &menuItem);

   return menuItem;
} 

void menuDocente_DocentesRegenteSelect(struct_noListaUtilizador* p_Primeiro ,int menuItem)
{
   switch(menuItem)
   {
       case 1:
       //Função Alterar Dados Próprios   
       break;
       
       case 2:
       //appendNovoUtilizador(p_ListaDeUtilizadores, novoUser);    
       //Utilizador novoUser = getUtilizadorFromTeclado(); 
       break;
       
       case 3:
       //Listar Alunos por número mecanográfico
       DisplayListOfUsers(p_Primeiro);
       break;
       
       case 4:
       //Função Remover Utilizador 
       break;
       
       case 5:
       //Função Alterar Dados de Utilizador 
       break;
       
       case 6:
       //Função Configurar Listagem Alunos (ordenação)
       break;
       
       case 7:
       //Função Listar Alunos segundo opção de ordenação
       break;
       
       case 8:
       //Função Configurar Listagem Alunos (paginação)
       break;
       
       case 9:
       //Função Listar Alunos segundo opção de paginação
       break;
       
       case 10:
       //Função Listar classificações dos alunos 
       break;
       
       case 11:
       //Função Estatísticas  
       break;
       
       case 0:
       exit(0);
       break;
   }
}
  

//Menu para DocentRegente
int menuDocenteRegente()
{
   int menuItem;
   
   //system("clear");
   
   printf("\t ________________________________________________\n");
   printf("\t|===============================================|\n");
   printf("\t|======     Linguagens de Programação     ======|\n");
   printf("\t|======          DocenteRegente           ======|\n");
   printf("\t|===============================================|\n");
   printf("\t|                                               |\n");
   printf("\t|1 ->  Alterar Dados Próprios                   |\n");
   printf("\t|2 ->  Inserir Utilizador                       |\n");
   printf("\t|3 ->  Listar Alunos por número mecanográfico   |\n");
   printf("\t|4 ->  Remover Utilizador                       |\n");
   printf("\t|5 ->  Alterar Dados de Utilizador              |\n");
   printf("\t|6 ->  Configurar Listagem Alunos (ordenação)   |\n");
   printf("\t|7 ->  Listar Alunos segundo opção de ordenação |\n");
   printf("\t|8 ->  Configurar Listagem Alunos (paginação)   |\n");
   printf("\t|9 ->  Listar Alunos segundo opção de paginação |\n");
   printf("\t|10->  Listar classificações dos alunos         |\n");
   printf("\t|11->  Lançar Notas                             |\n");
   printf("\t|12->  Estatísticas                             |\n");
   printf("\t|0 ->  Sair                                     |\n");
   printf("\t-------------------------------------------------\n");

   printf("\tEscolha uma opção por favor: ");
   
   //retornar o menu sleccionado pelo scanf %d
   scanf("%d", &menuItem);

   return menuItem;
}

void menuDocenteSelect(struct_noListaUtilizador* p_Primeiro ,int menuItem)
{
   switch(menuItem)
   {
       case 1:
       //Função Alterar Dados Próprios   
       break;
       
       case 2:
       //Função Inserir Utilizador 
       break;
       
       case 3:
       //Listar Alunos por número mecanográfico
       DisplayListOfUsers(p_Primeiro);
       break;
       
       case 4:
       //Função Remover Utilizador 
       break;
       
       case 5:
       //Função Alterar Dados de Utilizador 
       break;
       
       case 6:
       //Função Configurar Listagem Alunos (ordenação)
       break;
       
       case 7:
       //Função Listar Alunos segundo opção de ordenação
       break;
       
       case 8:
       //Função Configurar Listagem Alunos (paginação)
       break;
       
       case 9:
       //Função Listar Alunos segundo opção de paginação
       break;
       
       case 10:
       //Função Listar classificações dos alunos 
       break;
       
       case 11:
       //Função Lançar notas
       break;
       
       case 12:
       //Função Estatísticas  
       break;
       
       case 0:
       exit(0);
       break;
   } 
}